package org.shj.basic

class Man(val name : String)
/* 隐式转换方法一 */
/*object Man{
  implicit def man2Super(man: Man) = new SuperMan(man.name)
}*/

class SuperMan(name: String){
  def fly = println("I can fly")
}

/* 隐式转换方法二 */
object Implict{
  implicit def man2Super(man: Man) = new SuperMan(man.name)
}

object ImplicitTest {
  def main(args: Array[String]): Unit = {
    /* 隐式转换方法二 */
    import org.shj.basic.Implict._
    
    val man = new Man("SHJ")
    // Man 想要调用 SuperMan里的方法，需要进行隐式转换。进行隐式转换的方法：
    // 方法一
    // 1. 建立Man的伴生对象（object Man）
    // 2. 定义一个用implicit修饰的方法，传入Man类型的参数，返回SuperMan
    
    //方法二
    //1. 建立一个object（名字不是Man），
    //2. 定义一个用implicit修饰的方法，传入Man类型的参数，返回SuperMan
    //3. 导入这个object。如  import org.shj.basic.Implict._
    man.fly
    
    sendMsg("Java")(Delimiters("<<", ">>"))
    
    implicit val delims = Delimiters("<", ">")
    
    //并未传入delims这个参数, 编译器会在如下两个地方查找这样的一个对象
    //1.会在当前作用域所有可以用单个标识符指代的满足类型要求的一个对象
    //2.与所要求类型相关联的类型的伴生对象。相关联的类型包括所要求类型本身以及它的类型参数
    sendMsg("Scala") 
  }
  
  def sendMsg(name: String)(implicit delims: Delimiters) = println(delims.left + name+ delims.right)
}

case class Delimiters(left: String, right: String)